/** ==================================================================================== **/
/**  			 		Definizione degli ol.Control custom dell'applicazione.  		 **/
/** ==================================================================================== **/


/**
 * Define a namespace for the application.
 */
var mycontrol = {};
  
/**
 * Button control Abilita / Disabilita 3D
 * 
 * @constructor
 * @extends {ol.control.Control}
 * @param {Object} opt_options Control options.
 */
mycontrol.ol3DControl = function(opt_options) {

	var options = opt_options || {};
	
	/* DEFAULT: Testo dell'etichetta da utilizzare per il pulsante. */
	var label_ = '<i class="fa fa-globe"></i>';
	
	if (options.label != null && typeof options.label === 'string') {
		if(options.label != ""){
			label_ = document.createElement('span');
			label_.innerText = options.label;
		}
	}else
		if(options.label != null) label_ = options.label;
		
	// create button
	var button = document.createElement('button');
		button.appendChild(label_);
		button.title = (options.tipLabel != null && options.tipLabel != "") ? options.tipLabel : "3D";
		button.type = "button";
	
	
	var handleEnableDisable3D = function(e) {
		// get button 
		var element = e.currentTarget;
		// get DIV
		var parent = $(element).parent();
					 
		/** controllo se sto deselezionando o seleionando il controllo **/
		if( $(parent).hasClass("ol-selectable") ){
			/** --> deselezione del controllo **/
			
			$(parent).removeClass("ol-selectable");
			/** aggiungo il class che graficamente individua l'elemento come non selezionato **/
			$(parent).addClass("ol-unselectable");	 
		}else{
			/** --> selezione del controllo **/
					 
			$(parent).removeClass("ol-unselectable");
			/** aggiungo il class che graficamente individua l'elemento come non selezionato **/
			$(parent).addClass("ol-selectable");
		}
			   
		// abilita / disabilita
		options.map.setEnabled(!options.map.getEnabled());
	};
		  
	// add event click on button
	button.addEventListener('click', handleEnableDisable3D, false);

	// create div
	var element = document.createElement('div');
		element.className = options.className + " ol-control";
		element.appendChild(button);

	ol.control.Control.call(this, {
		element: element,
		target: options.target
	});
};
  
// add control in openlayers instance
ol.inherits(mycontrol.ol3DControl, ol.control.Control);
 

/**
 * Button control "Mostra / Nasconde albero dei layer"
 * 
 * @constructor
 * @extends {ol.control.Control}
 * @param {Object} opt_options Control options.
 */
mycontrol.olLayersTreeControl = function(opt_options) {

	var options = opt_options || {};

	// create button
	var button = document.createElement('button');
		button.innerHTML = '';
		button.title = (options.tipLabel != null && options.tipLabel != "") ? options.tipLabel : "Albero dei layer";
		button.type = "button";
		
	// create div
	var element = document.createElement('div');
		element.className = options.className + ' ol-control';
		element.appendChild(button);

	ol.control.Control.call(this, {
	    element: element,
	    target: options.target
	});
};

// add control in openlayers instance
ol.inherits(mycontrol.olLayersTreeControl, ol.control.Control);


/**
 * Button control "Attiva / Disattiva la geolocalizzazione/tracking della posizione dell'utente"
 * 
 * @constructor
 * @extends {ol.control.Control}
 * @param {Object} opt_options Control options.
 */
mycontrol.olGeolocationControl = function(opt_options) {

	var options = opt_options || {};
	 
	/* DEFAULT: Testo dell'etichetta da utilizzare per il pulsante. */
	var label_ = '<i class="fa fa-location-arrow"></i>';
	
	if (options.label != null && typeof options.label === 'string') {
		if(options.label != ""){
			label_ = document.createElement('span');
			label_.innerText = options.label;
		}
	}else
		if(options.label != null) label_ = options.label;
	
	// create button
	var button = document.createElement('button');
		button.appendChild(label_);
		button.title = (options.tipLabel != null && options.tipLabel != "") ? options.tipLabel : "Tracking";
		button.type = "button";
		
	// create div 
	var element = document.createElement('div');
		element.className = options.className + ' ol-control';
		element.appendChild(button);

	ol.control.Control.call(this, {
		element: element,
		target: options.target
	});
};
	
//add control in openlayers instance
ol.inherits(mycontrol.olGeolocationControl, ol.control.Control);


/**
 * Un controllo pulsante che, se premuto, attiva/disattiva lo strumento per disegnare su mappa
 * e misurare la lunghezza dell'arco tracciato.
 * NOTA: la misura avviene prendendo in considerazione la curvatura terrestre
 * 
 * @constructor
 * @extends {ol.control.Control}
 * @param {Object} opt_options Control options.
 */
mycontrol.olMeasureLengthControl = function(opt_options) {

	var options = opt_options || {};
	  
	// create button
	var button = document.createElement('button');
		button.innerHTML = '<i class="fa fa-m-length"></i>' + ((options.label != null && options.label != "") ? "<span>" + options.label + "</span>" : "");
		button.title = (options.tipLabel != null && options.tipLabel != "") ? options.tipLabel : "Misura della lunghezza";
		button.type = "button";
		
	// create div 
	var element = document.createElement('div');
		element.className = options.className + ' ol-control';
		element.appendChild(button);

	ol.control.Control.call(this, {
		element: element,
		target: options.target
	});
};
	
//add control in openlayers instance
ol.inherits(mycontrol.olMeasureLengthControl, ol.control.Control);


/**
 * Un controllo che attiva/disattiva lo strumento per disegnare su mappa un poligono e misurarne la grandezza della superficie.
 * NOTA: la misura avviene prendendo in considerazione la curvatura terrestre
 *
 * @constructor
 * @extends {ol.control.Control}
 * @param {Object} opt_options Control options.
 */
mycontrol.olMeasureAreaControl = function(opt_options) {

	var options = opt_options || {};
	  
	// create button
	var button = document.createElement('button');
		button.innerHTML = '<i class="fa fa-m-area"></i>' + ((options.label != null && options.label != "") ? "<span>" + options.label + "</span>" : "");
		button.title = (options.tipLabel != null && options.tipLabel != "") ? options.tipLabel : "Misura dell'area";
		button.type = "button";
		
	// create div 
	var element = document.createElement('div');
		element.className = options.className + ' ol-control';
		element.appendChild(button);

	ol.control.Control.call(this, {
		element: element,
		target: options.target
	});
};
	
//add control in openlayers instance
ol.inherits(mycontrol.olMeasureAreaControl, ol.control.Control);


/**
 * Un controllo che attiva/disattiva lo strumento per disegnare su mappa un cerchio e misurarne la larghezza del diametro e l'angolo.
 *
 * @constructor
 * @extends {ol.control.Control}
 * @param {Object} opt_options Control options.
 */
mycontrol.olMeasureAzimutControl = function(opt_options) {

	var options = opt_options || {};
	  
	// create button
	var button = document.createElement('button');
		button.innerHTML = '<i class="fa fa-m-azimut"></i>' + ((options.label != null && options.label != "") ? "<span>" + options.label + "</span>" : "");
		button.title = (options.tipLabel != null && options.tipLabel != "") ? options.tipLabel : "Misura azimut";
		button.type = "button";
		
	// create div 
	var element = document.createElement('div');
		element.className = options.className + ' ol-control';
		element.appendChild(button);

	ol.control.Control.call(this, {
		element: element,
		target: options.target
	});
};
	
//add control in openlayers instance
ol.inherits(mycontrol.olMeasureAzimutControl, ol.control.Control);

/**
 * Un controllo che attiva/disattiva lo strumento per disegnare su mappa la geometria di un punto.
 *
 * @constructor
 * @extends {ol.control.Control}
 * @param {Object} opt_options Control options.
 */
mycontrol.olDrawPointControl = function(opt_options) {

	var options = opt_options || {};
	  
	// create button
	var button = document.createElement('button');
		button.title = (options.tipLabel != null && options.tipLabel != "") ? options.tipLabel : "Punto";
		button.innerHTML = "<i class='fa " + options.icona + "'></i>" + (options.withLabel ? "<span>" + button.title + "</span>" : "");
		button.type = "button";
		
	// create div 
	var element = document.createElement('div');
		element.className = options.className + ' ol-control';
		element.appendChild(button);

	ol.control.Control.call(this, {
		element: element,
		target: options.target
	});
};
	
// add control in openlayers instance
ol.inherits(mycontrol.olDrawPointControl, ol.control.Control);


/**
 * Un controllo che attiva/disattiva lo strumento per disegnare su mappa la geometria di una linea.
 *
 * @constructor
 * @extends {ol.control.Control}
 * @param {Object} opt_options Control options.
 */
mycontrol.olDrawLineStringControl = function(opt_options) {

	var options = opt_options || {};
	  
	// create button
	var button = document.createElement('button');
		button.title = (options.tipLabel != null && options.tipLabel != "") ? options.tipLabel : "Linea";
		button.innerHTML = "<i class='fa " + options.icona + "'></i>" + (options.withLabel ? "<span>" + button.title + "</span>" : "");
		button.type = "button";
		
	// create div 
	var element = document.createElement('div');
		element.className = options.className + ' ol-control';
		element.appendChild(button);

	ol.control.Control.call(this, {
		element: element,
		target: options.target
	});
};
	
//add control in openlayers instance
ol.inherits(mycontrol.olDrawLineStringControl, ol.control.Control);


/**
 * Un controllo che attiva/disattiva lo strumento per disegnare su mappa la geometria di un poligono.
 *
 * @constructor
 * @extends {ol.control.Control}
 * @param {Object} opt_options Control options.
 */
mycontrol.olDrawPolygonControl = function(opt_options) {

	var options = opt_options || {};
	  
	// create button
	var button = document.createElement('button');
		button.title = (options.tipLabel != null && options.tipLabel != "") ? options.tipLabel : "Poligono";
		button.innerHTML = "<i class='fa " + options.icona + "'></i>" + (options.withLabel ? "<span>" + button.title + "</span>" : "");
		button.type = "button";
		
	// create div 
	var element = document.createElement('div');
		element.className = options.className + ' ol-control';
		element.appendChild(button);

	ol.control.Control.call(this, {
		element: element,
		target: options.target
	});
};
	
//add control in openlayers instance
ol.inherits(mycontrol.olDrawPolygonControl, ol.control.Control);


/**
 * Un controllo che attiva/disattiva lo strumento per disegnare su mappa la geometria di un cerchio.
 *
 * @constructor
 * @extends {ol.control.Control}
 * @param {Object} opt_options Control options.
 */
mycontrol.olDrawCircleControl = function(opt_options) {

	var options = opt_options || {};
	  
	// create button
	var button = document.createElement('button');
		button.title = (options.tipLabel != null && options.tipLabel != "") ? options.tipLabel : "Cerchio";
		button.innerHTML = "<i class='fa " + options.icona + "'></i>" + (options.withLabel ? "<span>" + button.title + "</span>" : "");
		button.type = "button";
		
	// create div 
	var element = document.createElement('div');
		element.className = options.className + ' ol-control';
		element.appendChild(button);

	ol.control.Control.call(this, {
		element: element,
		target: options.target
	});
};
	
//add control in openlayers instance
ol.inherits(mycontrol.olDrawCircleControl, ol.control.Control);


/**
 * Un controllo che attiva/disattiva lo strumento per modificare la geometria disegnata su mappa utilizzando
 * gli strumenti di edit.
 * 
 * @constructor
 * @extends {ol.control.Control}
 * @param {Object} opt_options Control options.
 */
mycontrol.olModifyControl = function(opt_options) {

	var options = opt_options || {};
	  
	// create button
	var button = document.createElement('button');
		button.innerHTML = "<i class='fa " + options.icona + "'></i>";
		button.title = (options.tipLabel != null && options.tipLabel != "") ? options.tipLabel : "Modifica";
		button.type = "button";
		
	// create div 
	var element = document.createElement('div');
		element.className = options.className + ' ol-control';
		element.appendChild(button);

	ol.control.Control.call(this, {
		element: element,
		target: options.target
	});
};
	
//add control in openlayers instance
ol.inherits(mycontrol.olModifyControl, ol.control.Control);


/**
 * Un controllo che attiva/disattiva lo strumento per rimuovere la geometria disegnata su mappa utilizzando
 * gli strumenti di edit.
 * 
 * @constructor
 * @extends {ol.control.Control}
 * @param {Object} opt_options Control options.
 */
mycontrol.olCancelDrawControl = function(opt_options) {

	var options = opt_options || {};
	  
	// create button
	var button = document.createElement('button');
		button.innerHTML = "<i class='fa " + options.icona + "'></i>";
		button.title = (options.tipLabel != null && options.tipLabel != "") ? options.tipLabel : "Elimina geometria";
		button.type = "button";
		
	// create div 
	var element = document.createElement('div');
		element.className = options.className + ' ol-control';
		element.appendChild(button);

	ol.control.Control.call(this, {
		element: element,
		target: options.target
	});
};
	
//add control in openlayers instance
ol.inherits(mycontrol.olCancelDrawControl, ol.control.Control);

/**
 * Controllo di default customizzabile
 * 
 * @constructor
 * @extends {ol.control.Control}
 * @param {Object} opt_options Control options.
 */
mycontrol.olBaseControl = function(opt_options) {

	var options = opt_options || {};
	  
	// create button
	var button = document.createElement('button');
		button.innerHTML = options.icona != null ? options.icona : "";
		button.title = (options.tipLabel != null && options.tipLabel != "") ? options.tipLabel : "";
		button.type = "button";
		
	// create div 
	var element = document.createElement('div');
		element.className = options.className + ' ol-control';
		element.appendChild(button);

	ol.control.Control.call(this, {
		element: element,
		target: options.target
	});
};
	
//add control in openlayers instance
ol.inherits(mycontrol.olBaseControl, ol.control.Control);